package drep;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

/**
 * Universidad Simón Bolívar
 * Curso de Redes I - Taller
 * Profesor: Ricardo Gonzalez
 * Trimestre Enero-Marzo 2011
 *
 * Proyecto 2 RD
 *
 * @author Grupo 9
 * @author Richard Simoes Ferreira
 * @author Ricardo Tocco
 *
 * @version 1.0
 */

public class ClientConnection {

 /**
 * Estructura que abstrae la comunicación de la aplicación a través de los
 * sockets
 */
    private int puerto;
    private String server; //Estructura de control
    private Socket socket = null;

     /**
     * Constructor de la clase ClientConnection
     * @param p Puerto bien conocido del servidor dmon
     * @param s Nombre o dirección del servidor dmon bien conocido
     */
    public ClientConnection (int p, String s){
        this.puerto = p;
        this.server = s;
    }
    /**
     * Obtener el puerto bien conocido del servidor dmon
     * @return  Puerto bien conocido del servidor dmon
     */
    public int getPuertoServidor(){
        return this.puerto;
    }
    /**
     * Establecer el puerto bien conocido del servidor dmon
     * @param p Puerto bien conocido del servidor dmon
     */
    public void setPuertoServidor(int p){
        this.puerto = p;
    }
    /**
     * Obtener el nombre o dirección del servidor dmon bien conocido
     * @return  Nombre o dirección del servidor dmon bien conocido
     */
    public String getServidor(){
        return this.server;
    }
    /**
     * Establecer nombre o dirección del servidor dmon bien conocido
     * @param s Nombre o dirección del servidor dmon bien conocido
     */
    public void setServidor(String s){
        this.server = s;
    }
    /**
     * Obtener el socket a través del cual se establece la comunicación
     * con el servidor dmon correspondiente
     * @return  Socket comunicación con drep
     */
    public Socket getSocket(){
        return this.socket;
    }
    /**
     * Establecer el socket a través del cual se establece la comunicación
     * con el servidor dmon correspondiente
     * @param s Socket comunicación con drep
     */
    public void setSocket (Socket s){
        this.socket = s;
    }
    /**
     * Establece la conexion con un monitor dmon bien conocido inicializando
     * el socket de comunicación.
     */
    public void Connect(){
        ErrorHandler errorH = new ErrorHandler();
        try {

            this.socket = new Socket (this.server,this.puerto);
        
        } catch (IOException e){
            errorH.errorPuertoClientConnect(e, puerto);
        }

    }
    /**
     * Cierra el socket de comunicación
     */
    public void Disconnect(){
        ErrorHandler errorH = new ErrorHandler();

        try {

            this.socket.close();

        } catch (IOException e){
            errorH.errorSocketClientDisconnect(e);
        }

    }
    /**
     * Obtiene una linea del flujo de comunicación enviado desde el servidor
     * dmon
     * @return  Linea capturada a través del socket de comunicación
     */
    public String Getlinea() {

        String buf;
        ErrorHandler errorH = new ErrorHandler();

        try {

            BufferedReader in =
                    new BufferedReader(new InputStreamReader(this.socket.getInputStream()));

            if((buf=in.readLine()) != null){
                return buf;
            } else {
                errorH.errorBufferGetLinea(this);
                return "excepcion";
            }

        } catch (IOException e){
            errorH.errorGetLinea(this);
            return null;
        }
    }

    /**
     * Envía un mensaje a través del socket de comunicación.
     * @param msg   Mensaje que se desea transmitir.
     * @return  0 si no hubo problemas y otro valor sino.
     */
    public int sendLinea(String msg){

        PrintWriter out = null;
        ErrorHandler errorH = new ErrorHandler();

        try {
            out = new PrintWriter(this.socket.getOutputStream(),true);
        } catch (IOException e){
            errorH.errorSendLinea(this,e);
            return -1;
        }
        //Enviamos el mensaje
        out.println(msg);
        return 0;
    }

}
